管道、xargs、 您所在的位置:网站首页 linux 管道与if结合使用 管道、xargs、

管道、xargs、

2023-07-29 12:55| 来源: 网络整理| 查看: 265

管道  command1 | command2

用竖线分割两个命令,把第一个命令的输出,作为第二个命令的输入。 此时需要第二个命令支持这种从管道获取输入的功能,例如cat ls就支持这种功能。

 

xargs command1 | xargs command2

xargs和管道类似,都是把第一个命令的输出传递到第二个命令。

与管道不同的是,管道给第二个命令传递是直接传到命令输入上,这种方式要求命令本身的支持,支持的命令较少。

而xargs,则是把第一个命令的输出作为参数传递到第二个命令上,这种方式只要第二个命令可以接受参数即可,支持的命令较多。

 

一个例子:

➜ ~ echo test.txt | cat test.txt ➜ ~ echo test.txt | xargs cat content of test.txt

echo test.txt | cat 是把 "test.txt" 这个字符串直接让cat输出

echo test.txt | xargs cat 是把 "test.txt" 作为参数传递给cat,表示把 test.txt 这个文件的内容输出

 

xargs还有一些有用的选项:

1. -d 选项 默认情况下xargs将其标准输入中的内容以空白(包括空格、Tab、回车换行等)分割成多个之后当作命令行参数传递给其后面的命令,并运行之,我们可以使用 -d 命令指定分隔符,例如: echo '11@22@33' | xargs echo 输出: 11@22@33 默认情况下以空白分割,那么11@22@33这个字符串中没有空白,所以实际上等价于 echo 11@22@33 其中字符串 '11@22@33' 被当作echo命令的一个命令行参数 echo '11@22@33' | xargs -d '@' echo 输出: 11 22 33 指定以@符号分割参数,所以等价于 echo 11 22 33 相当于给echo传递了3个参数,分别是11、22、33

2. -p 选项 使用该选项之后xargs并不会马上执行其后面的命令,而是输出即将要执行的完整的命令(包括命令以及传递给命令的命令行参数),询问是否执行,输入 y 才继续执行,否则不执行。这种方式可以清楚的看到执行的命令是什么样子,也就是xargs传递给命令的参数是什么,例如: echo '11@22@33' | xargs -p -d '@'  echo 输出: echo 11 22 33  ?...y      ==>这里询问是否执行命令 echo 11 22 33 输入y并回车,则显示执行结果,否则不执行  11 22 33   ==>执行结果

3. -n 选项 该选项表示将xargs生成的命令行参数,每次传递几个参数给其后面的命令执行,例如如果xargs从标准输入中读入内容,然后以分隔符分割之后生成的命令行参数有10个,使用 -n 3 之后表示一次传递给xargs后面的命令是3个参数,因为一共有10个参数,所以要执行4次,才能将参数用完。例如: echo '11@22@33@44@55@66@77@88@99@00' | xargs -d '@' -n 3 echo 输出结果: 11 22 33 44 55 66 77 88 99 00 等价于: echo 11 22 33 echo 44 55 66 echo 77 88 99 echo 00 实际上运行了4次,每次传递3个参数,最后还剩一个,就直接传递一个参数。

4. -E 选项,有的系统的xargs版本可能是-e  eof-str 该选项指定一个字符串,当xargs解析出多个命令行参数的时候,如果搜索到-e指定的命令行参数,则只会将-e指定的命令行参数之前的参数(不包括-e指定的这个参数)传递给xargs后面的命令 echo '11 22 33' | xargs -E '33' echo 输出: 11 22 可以看到正常情况下有3个命令行参数 11、22、33 由于使用了-E '33' 表示在将命令行参数 33 之前的参数传递给执行的命令,33本身不传递。等价于 echo 11 22 这里-E实际上有搜索的作用,表示只取xargs读到的命令行参数前面的某些部分给命令执行。 注意:-E只有在xargs不指定-d的时候有效,如果指定了-d则不起作用,而不管-d指定的是什么字符,空格也不行。 echo '11 22 33' | xargs -d ' ' -E '33' echo  => 输出 11 22 33 echo '11@22@33@44@55@66@77@88@99@00 aa 33 bb' | xargs -E '33' -d '@' -p  echo  => 输出 11 22 33 44 55 66 77 88 99 00 aa 33 bb

## -0 选项表示以 '\0' 为分隔符,一般与find结合使用

find . -name "*.txt" 输出: ./2.txt ./3.txt ./1.txt     => 默认情况下find的输出结果是每条记录后面加上换行,也就是每条记录是一个新行 find . -name "*.txt" -print0 输出: ./2.txt./3.txt./1.txt     => 加上 -print0 参数表示find输出的每条结果后面加上 '\0' 而不是换行 find . -name "*.txt" -print0 | xargs -0 echo 输出: ./2.txt ./3.txt ./1.txt find . -name "*.txt" -print0 | xargs -d '\0' echo 输出: ./2.txt ./3.txt ./1.txt xargs的 -0 和 -d '\0' 表示其从标准输入中读取的内容使用 '\0' 来分割,由于 find 的结果是使用 '\0' 分隔的,所以xargs使用 '\0' 将 find的结果分隔之后得到3个参数: ./2.txt ./3.txt ./1.txt  注意中间是有空格的。上面的结果就等价于 echo ./2.txt ./3.txt ./1.txt 实际上使用xargs默认的空白分隔符也是可以的  find . -name "*.txt"  | xargs  echo   因为换行符也是xargs的默认空白符的一种。find命令如果不加-print0其搜索结果的每一条字符串后面实际上是加了换行

 

-exec

command1 -exec command2 {} \;

-exec 和 xargs 的作用相似,都是把前一个命令的输出作为参数传给第二个命令

find . -name "test.txt" -exec cat {} \; content of test.txt

 

-exec与xargs不同的是:

-exec是将结果逐条传递给后面的命令,后面的命令逐条执行。

xargs是将结果作为一个列表全部传递给后面的命令,后面的命令一次性执行参数串,可以通过xargs -p ls -l来查看即将要执行的完整的命令。

 

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有